package com.example.housekeeping.service.impl;

import com.example.housekeeping.ex.ServiceException;
import com.example.housekeeping.pojo.entity.Comment;
import com.example.housekeeping.pojo.entity.ServeItem;
import com.example.housekeeping.pojo.dto.ServeItemAddNewDTO;
import com.example.housekeeping.pojo.dto.ServeItemUpdateDTO;
import com.example.housekeeping.pojo.vo.CommentStandardVO;
import com.example.housekeeping.pojo.vo.ServeItemListItemVO;
import com.example.housekeeping.pojo.vo.ServeItemStandardVO;
import com.example.housekeeping.mapper.ServeItemMapper;
import com.example.housekeeping.service.ServeItemService;
import com.example.housekeeping.web.ServiceCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 服务内容表(ServeItem)表服务实现类
 *
 * @author bob
 * @since 2023-03-20 19:36:07
 */
@Slf4j
@Service
public class ServeItemServiceImpl implements ServeItemService {

    @Autowired
    private ServeItemMapper serveItemMapper;

    /**
     * 新增数据
     *
     * @param serveItemAddNewDTO 实例对象
     * @return 实例对象
     */
    @Override
    public void addNew(ServeItemAddNewDTO serveItemAddNewDTO) {
        log.debug("开始处理【新增服务项目数据】的业务，参数：{}",serveItemAddNewDTO);
        //获取id
        Long id=serveItemAddNewDTO.getId();
        //根据id查询数据
        ServeItemStandardVO standardById = serveItemMapper.getStandardById(id);
        //判断数据是否存在
        if (standardById!=null){
            //如果数据存在，则抛异常
            String message="服务项目数据，已存在请勿重复添加";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_INSERT,message);
        }
        //如果数据不存在则插入数据
        ServeItem serveItem=new ServeItem();
        BeanUtils.copyProperties(serveItemAddNewDTO,serveItem);
        int insert = serveItemMapper.insert(serveItem);
        log.debug("新增服务数据成功，受影响行数：{}",insert);
    }


    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
    @Override
    public void deleteById(Long id) {
    log.debug("开始处理通过id【删除数据】的业务，id:{}",id);
        ServeItemStandardVO standardById = serveItemMapper.getStandardById(id);
        if (standardById==null){
            String message="服务器忙，请联系管理员！";
            log.error(message);
            throw new ServiceException(ServiceCode.ERROR_NOT_FOUND,message);
        }
        int delete = serveItemMapper.deleteById(id);
        if (delete==0){
            String message="删除失败，请联系管理员";
            log.error(message);
            throw new ServiceException(ServiceCode.ERROR_DELETE,message);
        }
        log.debug("删除业务处理完成！");
    }

    /**
     * 修改数据
     *
     * @param serveItemUpdateDTO 实例对象
     * @return 实例对象
     */
    @Override
    public void updateById(Long id, ServeItemUpdateDTO serveItemUpdateDTO) {
        log.debug("开始处理【根据id修改】业务，id为:{},参数:{}",id,serveItemUpdateDTO);
        //根据id查询数据是否存在，数据存在业务即继续进行，不存在即抛出异常
        ServeItemStandardVO standardById = serveItemMapper.getStandardById(id);
        if (standardById==null){
            String message="服务器忙，请联系管理员！";
            log.error(message);
            throw new ServiceException(ServiceCode.ERROR_NOT_FOUND,message);
        }
        //将入参数据复制到实体类里
        ServeItem serveItem=new ServeItem();
        BeanUtils.copyProperties(serveItemUpdateDTO,serveItem);
        serveItem.setId(id);
        log.debug("复制完成的数据：{}",serveItem);
        //调用Service的方法实现修改
        int update = serveItemMapper.update(serveItem);
        //判断返回的int值是否为0，为0则修改失败
        if (update==0){
            String message="修改失败";
            log.error(message);
            throw new ServiceException(ServiceCode.ERROR_UPDATE,message);
        }
        log.debug("【根据id修改业务】完成");
    }

    @Override
    public void setPass(Long id) {
        log.debug("开始处理【通过的服务内容】的业务，参数：{}", id);
        updateIsPassById(id, 1);
    }

    @Override
    public void setNotPass(Long id) {
        log.debug("开始处理【未通过的服务内容】的业务，参数：{}", id);
        updateIsPassById(id, 0);
    }

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    @Override
    public ServeItemStandardVO getStandardById(Long id) {
        log.debug("开始处理【根据id查询】的业务，参数:{}",id);
        ServeItemStandardVO standardById = serveItemMapper.getStandardById(id);
        if (standardById==null){
            String message="数据不存在";
            log.error(message);
            throw new ServiceException(ServiceCode.ERROR_NOT_FOUND,message);
        }
        log.debug("根据id查询业务完成");
        return standardById;
    }

    /**
     * 查询列表数据
     *
     * @return 实例对象
     */
    @Override
    public List<ServeItemListItemVO> list() {
        log.debug("开始处理【查询列表】的业务");
        List<ServeItemListItemVO> list = serveItemMapper.list();
        if (list==null){
            String message="数据不存在";
            log.error(message);
            throw new ServiceException(ServiceCode.ERROR_NOT_FOUND,message);
        }
        log.debug("查询全表业务完成");
        return list;
    }

    @Override
    public ServeItem selectByWorkerId(Long workerId) {
        log.debug("开始处理[根据服务员ID查询服务]业务");
        ServeItem serveItem = serveItemMapper.selectByWorkerId(workerId);
        if (serveItem == null){
            String message="数据不存在";
            log.error(message);
            throw new ServiceException(ServiceCode.ERROR_NOT_FOUND,message);
        }
        log.debug("根据服务员ID查询服务列表业务完成");
        return serveItem;
    }

    private void updateIsPassById(Long id, Integer pass) {
        ServeItemStandardVO currentServeItem = serveItemMapper.getStandardById(id);
        if (currentServeItem == null) {
            String message = PASS_TEXT[pass] + "评论失败，评论数据不存在";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_NOT_FOUND, message);
        }

        if (currentServeItem.getIsPass().equals(pass)) {
            String message = PASS_TEXT[pass] + "评论失败，此评论已经处于" + PASS_TEXT[pass] + "状态";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_CONFLICT, message);
        }

        ServeItem updateServeItem = new ServeItem();
        updateServeItem.setId(id);
        updateServeItem.setIsPass(pass);
        int rows = serveItemMapper.update(updateServeItem);
        if (rows != 1) {
            String message = PASS_TEXT[pass] + "评论失败，服务器忙，请稍后再尝试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_UPDATE, message);
        }
    }

}
